"""
统一的模拟运行器，支持命令行参数，动态获取系统状态
"""

import argparse
import sys
import os

# 添加src目录到Python路径
sys.path.append(os.path.join(os.path.dirname(__file__), 'src'))

from src.entity.System import SinglyStarSystem, DoublyStarSystem, MultiStarSystem
from src.util.star_animation import StarAnimation
from src.util.config_loader import ConfigLoader


def create_system(system_type, stars):
    """根据系统类型创建相应的系统对象"""
    if system_type == "single":
        return SinglyStarSystem(stars[0])
    elif system_type == "double":
        return DoublyStarSystem(stars[0], stars[1])
    elif system_type == "multi":
        return MultiStarSystem(stars)
    else:
        raise ValueError(f"不支持的系统类型: {system_type}")


def main():
    parser = argparse.ArgumentParser(description='天体系统模拟器')
    parser.add_argument('config', help='配置文件路径')
    parser.add_argument('--show', action='store_true', default=True,
                        help='是否显示动画界面')
    parser.add_argument('--no-show', action='store_false', dest='show',
                        help='不显示动画界面，仅生成文件')

    args = parser.parse_args()

    try:
        # 加载配置
        config = ConfigLoader.load_config(args.config)

        # 创建星体和系统
        stars = ConfigLoader.create_stars_from_config(config)
        system = create_system(config['system_type'], stars)

        # 获取绘图元数据和模拟参数
        bodies_info = ConfigLoader.create_bodies_info_from_config(config)
        sim_params = ConfigLoader.get_simulation_params(config)

        # 运行动画
        StarAnimation(
            bodies_info=bodies_info,
            system=system,
            **sim_params
        ).run(show=args.show)

        print(f"模拟完成！输出文件: {sim_params['mp4_path']}")

    except Exception as e:
        print(f"错误: {e}")
        sys.exit(1)


if __name__ == "__main__":
    main()